package com.作业.Day21;

import jdk.nashorn.internal.ir.CallNode;

import java.lang.reflect.Field;

/**
 *
 * 通过反射写一个通用的设置某个对象的某个属性为指定的值
 * public void setProperty(Object obj, String propertyName, Object value){}，
 * 此方法可将obj对象中名为propertyName的属性的值设置为value。
 *
 *
 */
public class Homework3 {
    public static void main(String[] args) {
        Person person = new Person();
        setProperty(person,"name","小王");
        System.out.println(person);
    }
  static   public void setProperty(Object obj, String propertyName, Object value){
     try {
         //获取类对象
         Class<?> aClass = obj.getClass();
         //实例化对象
         Object o = aClass.newInstance();
         //获取属性
         Field declaredField = aClass.getDeclaredField(propertyName);
         //设置属性
//         因此，最终 main 方法中看到的 person 对象被修改，是因为你直接操作了原对象，而不是新实例对原对象产生了影响。新实例 o 在代码中未被使用，对原对象没有任何作用。
         declaredField.setAccessible(true);
         declaredField.set(obj,value);
         System.out.println(obj);
     } catch (NoSuchFieldException e) {
         throw new RuntimeException(e);
     } catch (InstantiationException e) {
         throw new RuntimeException(e);
     } catch (IllegalAccessException e) {
         throw new RuntimeException(e);
     }
    }
}
